package com.xuecheng.media.service;

import com.xuecheng.dto.PageParamsDto;
import com.xuecheng.dto.PageResult;
import com.xuecheng.dto.RestResponse;
import com.xuecheng.media.model.dto.QueryMediaParamsDto;
import com.xuecheng.media.model.dto.UploadFileParamsDto;
import com.xuecheng.media.model.dto.UploadFileResultDto;
import com.xuecheng.media.model.po.MediaFiles;

import java.io.File;

/**
 * @author CG
 * @version 1.0
 * @description 媒资文件管理业务类
 */
public interface MediaFileService {

    /**
     * @param pageParams          分页参数
     * @param queryMediaParamsDto 查询条件
     * @return com.xuecheng.base.model.PageResult<com.xuecheng.media.model.po.MediaFiles>
     * @description 媒资文件查询方法
     * @author CG
     */
    public PageResult<MediaFiles> queryMediaFiels(Long companyId, PageParamsDto pageParams, QueryMediaParamsDto queryMediaParamsDto);


    /**
     * 上传文件
     * @param companyId：机构Id
     * @param uploadFileParamsDto:文件信息
     * @param loadFilePath:文件的本地路径
     * @return
     */
    public UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto,String loadFilePath);


    /**
     * 事务控制添加到数据库
     * @param companyId
     * @param fileMd5
     * @param uploadFileParamsDto
     * @param bucket
     * @param objectName
     * @return
     */
    public MediaFiles addMediaFilesToDb(Long companyId,String fileMd5,UploadFileParamsDto uploadFileParamsDto,String bucket,String objectName);


    /**
     * 检查文件是否存在
     * @param fineMd5
     * @return：false：不存在 true：存在
     */
    public RestResponse<Boolean> checkFile(String fineMd5);

    /**
     * 检查分块是否存在
     * @param fileMd5:文件的MD5
     * @param chunkIndex：分块序号
     * @return：false：不存在 true：存在
     */
    public RestResponse<Boolean> checkChunk(String fileMd5, int chunkIndex);


    /**
     * 上传分块
     * @param fileMd5：文件md5
     * @param chunk：分块序号
     * @param localChunkFilePath：分块文件的本地路径
     * @return
     */
    public RestResponse uploadChunk(String fileMd5,int chunk,String localChunkFilePath);


    /**
     * 合并分块
     * @param companyId：机构id
     * @param fileMd5：文件的md5
     * @param chunkTotal：分块综合
     * @param uploadFileParamsDto：文件信息
     * @return
     */
    public RestResponse mergeChunks(Long companyId,String fileMd5,int chunkTotal,UploadFileParamsDto uploadFileParamsDto);


    /**
     * 从minio下载文件
     * @param bucket 桶
     * @param objectName 对象名称
     * @return 下载后的文件
     */
    public File downloadFileFromMinIO(String bucket, String objectName);


    /**
     * 将文件上传到minio
     *
     * @param localFilePath：文件的本地路径
     * @param mimeType：媒体类型
     * @param bucket：桶
     * @param objectName：对象名
     * @return
     */
    public boolean addMediaFilesToMinIO(String localFilePath, String mimeType, String bucket, String objectName);
}
